package com.sisgesbyte.dao.seguridad;


import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.NuevoUsuarioRequest;
import com.sisgesbyte.dao.beanDao.RegistrarAccesoRequest;
import com.sisgesbyte.dao.beanDao.UsuarioRequest;
import com.sisgesbyte.dao.beanDao.ValidaLocalizacionRequest;
import com.sisgesbyte.dao.beanDao.ValidarHostRequest;
import com.sisgesbyte.data.entity.seguridad.AccesoHost;
import com.sisgesbyte.data.entity.seguridad.InsertaUsuarioEntity;
import com.sisgesbyte.data.entity.seguridad.LogAccesoEntity;
import com.sisgesbyte.data.entity.seguridad.RestriccionesEntity;
import com.sisgesbyte.data.entity.seguridad.ValidaLocalizacionEntity;
import com.sisgesbyte.data.entity.seguridad.ValidaUsuarioEntity;
import com.sisgesbyte.data.util.AbstractFacade;


@Stateless
public class SeguridadDaoImpl extends AbstractFacade<InsertaUsuarioEntity> implements SeguridadDao{

	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}
	
	public SeguridadDaoImpl(){
		super(InsertaUsuarioEntity.class);
	}

	@Override
	public InsertaUsuarioEntity insertarUsurario(NuevoUsuarioRequest nuevoUsuarioRequest) {
		//enviar siempre valores vacios en vez de nulos para evitar errores
		
		Query query = em.createNamedQuery("seguridad.insertarUsuario");
			query.setParameter("empredaid", nuevoUsuarioRequest.getCodEmpresa());
			query.setParameter("usuario_sys", nuevoUsuarioRequest.getUsuario());
			query.setParameter("clave_sys", nuevoUsuarioRequest.getClave());
			query.setParameter("rol", nuevoUsuarioRequest.getCodRol());
			
		return (InsertaUsuarioEntity) query.getSingleResult();
	}

	
	@Override
	public AccesoHost validarHost(ValidarHostRequest validarHostRequest) {
		//enviar siempre valores vacios en vez de nulos para evitar errores
		 Query query = em.createNamedQuery("seguridad.validarhost");
		 		query.setParameter("cod_empresa", validarHostRequest.getCodEmpresa());
		 		query.setParameter("cod_usuario", validarHostRequest.getCodUsuario());
		 		query.setParameter("ip_public", validarHostRequest.getIpPublica());
		 		query.setParameter("act_ipp", validarHostRequest.isActIpp());
		 		query.setParameter("ip_local", validarHostRequest.getIpLocal());
		 		query.setParameter("act_ipl", validarHostRequest.isActIpl());
		 		query.setParameter("mac_host", validarHostRequest.getMacHost());
		 		query.setParameter("act_mac", validarHostRequest.isActMac());
		 		
		return (AccesoHost)query.getSingleResult();
	}

	@Override
	public ValidaUsuarioEntity validarAcceso(UsuarioRequest usuario) {
		//enviar siempre valores vacios en vez de nulos para evitar errores
		Query query = em.createNamedQuery("seguridad.validarusuario");
				query.setParameter("empresaid", usuario.getCodEmpresa());
				query.setParameter("usuario_sys", usuario.getUsuario());
				query.setParameter("clave_sys", usuario.getClave());
				
		return (ValidaUsuarioEntity)query.getSingleResult();
	}

	@Override
	public ValidaLocalizacionEntity validarLocalizacion(
			ValidaLocalizacionRequest validaLocalizacionRequest) {
		//enviar siempre valores vacios en vez de nulos para evitar errores
		
		Query query = em.createNamedQuery("seguridad.validarlocalizacion");
			    query.setParameter("cod_empresa", validaLocalizacionRequest.getCodEmpresa());
			    query.setParameter("cod_usuario", validaLocalizacionRequest.getCodUsuario());
			    query.setParameter("cod_cont", validaLocalizacionRequest.getContinente());
			    query.setParameter("active_cont", validaLocalizacionRequest.isActContinente());
			    query.setParameter("cod_paisid", validaLocalizacionRequest.getPais());
			    query.setParameter("active_pais", validaLocalizacionRequest.isActPais());
			    query.setParameter("cod_div", validaLocalizacionRequest.getDivisionPais());
			    query.setParameter("active_div", validaLocalizacionRequest.isActDivPais());
			    query.setParameter("cod_ciu", validaLocalizacionRequest.getCiudad());
			    query.setParameter("active_ciu", validaLocalizacionRequest.isActCiudad());
		return (ValidaLocalizacionEntity)query.getSingleResult();
	}
	
	@Override
	public LogAccesoEntity registrarAcceso(RegistrarAccesoRequest registrarAccesoRequest) {
		//enviar siempre valores vacios en vez de nulos para evitar errores
		Query query = em.createNamedQuery("seguridad.registraracceso");
		      query.setParameter("in_empresa", registrarAccesoRequest.getEmpresa());
			  query.setParameter("in_usuario", registrarAccesoRequest.getUsuario());
			  query.setParameter("in_cod_trans", registrarAccesoRequest.getCodTrans());
			  query.setParameter("in_tipo_host", registrarAccesoRequest.getTipoHost());
			  query.setParameter("in_marca_host", registrarAccesoRequest.getMarcaHost());
			  query.setParameter("in_navegador", registrarAccesoRequest.getNavegador());
			  query.setParameter("in_ip_publica", registrarAccesoRequest.getIpPublica());
			  query.setParameter("in_ip_estatica", registrarAccesoRequest.getIpEstatica());
			  query.setParameter("in_continente", registrarAccesoRequest.getContinente());
			  query.setParameter("in_pais", registrarAccesoRequest.getPais());
			  query.setParameter("in_region", registrarAccesoRequest.getRegion());
			  query.setParameter("in_ciudad", registrarAccesoRequest.getCiudad());
			  query.setParameter("in_latmap", registrarAccesoRequest.getLatmap());
			  query.setParameter("in_lngmap",registrarAccesoRequest.getLngmap());
			  query.setParameter("in_active",registrarAccesoRequest.getActive());
		
		return (LogAccesoEntity)query.getSingleResult();
	}

	@Override
	public List<RestriccionesEntity> listarRestricciones(int codEmpresa) {
		
		Query query = em.createNamedQuery("seguridad.listaRestricciones");
				query.setParameter("codEmpresa", codEmpresa);
				
				List<RestriccionesEntity> ls = 	query.getResultList();
				
		return ls;
	}

}
